#ifndef ROBOTMANAGER_H
#define ROBOTMANAGER_H

#include <QObject>
#include <QTimer>
#include <QVariantList>
#include <QVariantMap>
#include <QJsonObject>
#include <QFile>
#include <QTextStream>
#include <QtPositioning/QGeoCoordinate>
#include <QHash>
#include <QDateTime>
#include "../auth/DatabaseManager.h"
#include "RobotMemoryCache.h"
#include "QMLControlInterface.h"

class TcpServer;
class RobotClient;

class RobotManager : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool serverRunning READ isServerRunning NOTIFY serverRunningChanged)
    Q_PROPERTY(QString serverAddress READ getServerAddress NOTIFY serverAddressChanged)
    Q_PROPERTY(int serverPort READ getServerPort NOTIFY serverPortChanged)
    Q_PROPERTY(int connectedRobotsCount READ getConnectedRobotsCount NOTIFY connectedRobotsCountChanged)

public:
    explicit RobotManager(QObject *parent = nullptr);
    ~RobotManager();

    // 服务器控制
    Q_INVOKABLE bool startServer(int port = 8888);
    Q_INVOKABLE void stopServer();
    
    // 属性访问器
    bool isServerRunning() const;
    QString getServerAddress() const;
    int getServerPort() const;
    int getConnectedRobotsCount() const;
    
    // 机器人管理
    Q_INVOKABLE QVariantList getAllRobots();
    Q_INVOKABLE QVariantMap getRobotInfo(const QString &sn);
    Q_INVOKABLE QVariantList getRobotData(const QString &sn, int limit = 100);
    Q_INVOKABLE bool sendControlCommand(const QString &sn, const QVariantMap &command);
    Q_INVOKABLE bool sendTimeSyncCommand(const QString &sn);
    Q_INVOKABLE QVariantList generateRawCommands(const QString &direction);
    
    // 路径跟踪功能
    Q_INVOKABLE bool startPathTracking(const QString &sn, const QVariantList &pathPoints, int cruiseSpeed = 20);
    Q_INVOKABLE void stopPathTracking(const QString &sn);
    Q_INVOKABLE bool isPathTracking(const QString &sn) const;

    // QML控制接口相关
    Q_INVOKABLE void setQMLControlInterface(QObject *qmlContext);
    Q_INVOKABLE QMLControlInterface* getControlInterface() const;

signals:
    void serverRunningChanged();
    void serverAddressChanged();
    void serverPortChanged();
    void connectedRobotsCountChanged();
    void robotRegistered(const QString &sn);
    void robotDisconnected(const QString &sn);
    void robotDataReceived(const QString &sn, const QVariantMap &data);
    void robotLocationUpdated(const QString &sn, double longitude, double latitude);  // 新增实时定位信号
    void serverError(const QString &error);
    
    // 路径跟踪信号
    void pathTrackingCompleted(const QString &sn);
    void pathTrackingError(const QString &sn, const QString &error);
    void pathTrackingProgress(const QString &sn, int currentIndex, int totalPoints, double distanceToTarget);

private slots:
    void onServerStarted(const QString &address, int port);
    void onServerStopped();
    void onClientConnected(const QString &address, int port);
    void onClientDisconnected(const QString &address);
    void onRobotRegistered(const QString &sn);
    void onRobotDisconnected(const QString &sn);
    void onRobotDataReceived(const QString &sn, const QJsonObject &data);
    void onRobotHeartbeatReceived(const QString &sn, const QJsonObject &data);
    void onServerError(const QString &error);
    void updateOfflineRobots();
    void onTimeSyncTimeout();
    void onPathTrackingLoop(const QString &sn);  // 路径跟踪控制循环

private:
    TcpServer *m_tcpServer;
    DatabaseManager *m_dbManager;
    RobotMemoryCache *m_memoryCache;  // 内存状态缓存
    QMLControlInterface *m_controlInterface;  // QML控制接口
    
    QTimer *m_offlineTimer;
    QTimer *m_timeSyncTimer;
    QTimer *m_archiveTimer;  // 数据归档定时器
    
    // 添加心跳调试日志文件
    QFile *m_heartbeatDebugLog;
    QTextStream *m_heartbeatDebugStream;
    
    // 控制命令日志文件
    QFile *m_controlLog;
    
    // 根据项目规范调整参数：对于高频心跳（每2-5秒一次）
    // 心跳超时时间设置为30秒，离线检测时间为45秒
    static const int OFFLINE_CHECK_INTERVAL = 45000; // 45秒检查一次离线状态
    static const int OFFLINE_THRESHOLD = 30000;     // 30秒无心跳视为离线
    static const int TIME_SYNC_INTERVAL = 3600000;   // 1小时执行一次时间同步
    static const int ARCHIVE_INTERVAL = 300000;    // 5分钟归档一次数据到数据库
    
    void initializeDatabase();
    RobotClient* findClientBySN(const QString &sn);
    
    // 添加心跳调试日志功能
    void initializeHeartbeatDebugLog();
    void logHeartbeatDebugInfo(const QString &sn, qint64 timestamp, const QString &info);
    
    // 异常日志记录功能
    void logJsonParseError(const QString &clientIp, const QString &rawData, const QString &errorMsg);
    
    // 控制命令日志记录功能
    void logControlCommand(const QString &robotSN, const QJsonObject &command);
    
    // 时间同步日志记录功能
    void logTimeSyncCommand(const QString &robotSN, const QString &syncId, bool success);
    
    // 内存状态更新处理
    void onRobotStatusUpdated(const QString &sn, const QVariantMap &status);
    void onRobotConnectionChanged(const QString &sn, bool connected);
    
    // 数据归档功能
    void archiveRobotData();
    void onArchiveTimeout();
    
    // 路径跟踪数据结构
    struct PathTracker {
        QList<QGeoCoordinate> pathPoints;      // 路径点列表
        int currentTargetIndex;                // 当前目标点索引
        int cruiseSpeed;                       // 巡航速度
        QTimer *controlTimer;                  // 控制循环定时器
        QGeoCoordinate lastPosition;           // 上一位置（用于估算朝向）
        QDateTime lastPositionTime;             // 上一位置时间
        double estimatedHeading;               // 估算的朝向（度）
        int arrivalCount;                      // 到达计数（防抖动）
        bool isActive;                         // 是否激活
        bool isNavigatingToStart;              // 是否正在导航到路径起点（新增）
        double startPointDistance;            // 到路径起点的距离（新增）
        int lastMotionCommand;                 // 最近一次下发的运动指令（-1后退/0停止/1前进）
    };
    
    QHash<QString, PathTracker*> m_pathTrackers;  // 每个机器人的跟踪器
    
    // 路径跟踪辅助函数
    void updateRobotPositionForTracking(const QString &sn, double lon, double lat);
    int calculateTurnValue(double azimuth, double currentHeading, bool isUTurn);
    void sendTrackingCommand(const QString &sn, int turnValue, int speedValue);
    
    // 【改进】基于相对坐标的方向判断函数
    struct DirectionInfo {
        bool needTurn;      // 是否需要转向
        bool needUTurn;     // 是否需要掉头
        double turnAngle;    // 转向角度（度）
        QString direction;  // 方向描述（前/后/左/右）
    };
    DirectionInfo calculateDirectionInfo(const QGeoCoordinate &robotPos, 
                                         const QGeoCoordinate &targetPos,
                                         double robotHeading = 0.0,
                                         bool hasRobotHeading = false);
};

#endif // ROBOTMANAGER_H